package handlers

import (
	"brood-agent2/conf"
	"brood-agent2/utils"
	"bytes"
	"fmt"
	"os"
	"path/filepath"
)

type DownloadUrl struct {
	Url         string `json:"url"`          // 下载链接
	SavePath    string `json:"save_path"`    // 需要保存的文件名
	ExtractType string `json:"extract_type"` // 解包类型
}

// extractPkg 安装无需编译的二进制包
func extractPkg(pkgUrl string, applicationDir string, extractType string, pkgName string) error {

	err := utils.CreateDirIfNotExist(applicationDir, os.FileMode(0755))
	if err != nil {
		return err
	}
	dirList, err := utils.GetDirDetailList(applicationDir, pkgName)
	if err != nil {
		return err
	}
	if len(dirList) > 0 {
		utils.Logger.Info(fmt.Sprintf("%s has been installed before,skip download and extract", pkgName))
		return nil
	}

	// 下载安装包
	tmpDir := filepath.Join(conf.Conf.TmpDir, utils.GenUUID4().String())
	pkgPath := filepath.Join(tmpDir, utils.GenUUID4().String())
	err = utils.DownloadFile(pkgUrl, pkgPath, os.FileMode(0755), false)
	if err != nil {
		return err
	}

	// 解压到临时目录
	err = utils.ExtractFile(pkgPath, tmpDir, extractType)
	if err != nil {
		return err
	}
	dirList, err = utils.GetDirDetailList(tmpDir, pkgName)
	if err != nil {
		return err
	}
	if len(dirList) != 1 {
		errStr := fmt.Sprintf("package with prefix %s not found in %s", pkgName, tmpDir)
		utils.Logger.Error(errStr)
		return fmt.Errorf(errStr)
	}
	tmpInstallDir := filepath.Join(tmpDir, dirList[0].Name())
	utils.Logger.Debug(fmt.Sprintf("tmpInstallDir :%s", tmpInstallDir))

	// 创建安装目录，并且将临时目录文件mv到安装目录中
	_, err = utils.ExecCmd("", []string{}, bytes.Buffer{}, "mv", tmpInstallDir, filepath.Join(applicationDir, pkgName))
	//err = os.Rename(tmpInstallDir, filepath.Join(applicationDir, pkgName))
	if err != nil {
		return err
	}

	// 删除临时目录
	err = utils.RemoveAll(tmpDir)
	if err != nil {
		return err
	}
	return nil
}

// addSoftLink 创建dst，软连接到src,如果软连接存在，则覆盖
func addSoftLink(src string, dst string) error {

	_, err := os.Stat(src)
	if err != nil {
		utils.Logger.Error(err)
		return err
	}

	_, err = os.Stat(dst)
	if err == nil {
		//已存在，删除
		err = utils.RemoveAll(dst)
		if err != nil {
			return err
		}
	}

	_, err = utils.ExecCmd("/", []string{}, bytes.Buffer{}, "ln", "-s", src, dst)
	if err != nil {
		return err
	}
	utils.Logger.Info(fmt.Sprintf("soft link created, %s", dst))

	return nil

}

func installCheck(service string) error {
	status, _ := utils.ServiceStatus(service)
	if status != "" {
		// 已经注册服务
		errStr := fmt.Sprintf("%s status is %s，install terminated", service, status)
		utils.Logger.Error(errStr)
		return fmt.Errorf(errStr)
	}
	return nil
}
